今天颱風天,真的很認真的研究的一天怎麼把背景和人物放進我的 pygame 小淘氣裡面。
大家猜猜看結果會是怎樣吧?
一樣先上一段程式碼:
import pygame
import random
pygame.init()
black = (0, 0, 0)
green = (91,231,196)
gameNaughtybox = pygame.display.set_mode((600,600))
pygame.Surface((600,600))
dest = (600,600)
pygame.display.set_caption("Naughty Box")
walkRight = [pygame.image.load('Angel-1-3.png'), pygame.image.load('Angel-1-1.png')]
walkLeft = [pygame.image.load('Angel-1-7.png'), pygame.image.load('Angel-1-6.png')]
bg = pygame.image.load('pipo-battlebg007b.png')
bg.blit(bg,(600,600))
pygame.display.flip()
class Player(pygame.sprite.Sprite):
character=[pygame.image.load("Angel-1-4.png")]
BGM = [pygame.mixer.music.load("NES - CIRCUS CHARLIE-B(stage1_stage5).mp3")]
pygame.mixer.music.play()
clock = pygame.time.Clock()
x = 50
y = 50
width =65
height = 65
vel = 8
isJump = False
jumpCount = 15
left = False
right =False
walkCount = 0
def redrwnewWindow():
global walkCount
gameNaughtybox.blit(bg, dest, area=None, special_flags = 0)
if walkCount + 1 >= 29:
walkCount = 0
if left:
gameNaughtybox.blit(walkLeft)[walkCount//3. (x,y)]
walkCount +=1
elif right:
gameNaughtybox.blit(walkRight[walkCount//3], (x,y))
walkCount +=1
else:
gameNaughtybox.blit(character)
pygame.display.update()
run = True
while run:
clock.tick(29)
gameNaughtybox.blit(bg, dest, area=None, special_flags = 0)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys [pygame.K_LEFT] and x > vel:
x -= vel
left = True
right = False
elif keys [pygame.K_RIGHT] and x < 600 - width - vel:
x += vel
left = False
right = True
elif keys [pygame.K_UP] and y > vel:
y -= vel
right = True
left = True
elif keys [pygame.K_DOWN] and y < 600 - height - vel:
y += vel
right = False
left = False
else:
right = False
left = False
walkCount = 0
if not (isJump):
if keys [pygame.K_UP] and y > vel:
y -= vel
if keys [pygame.K_DOWN] and y < 600 - height - vel:
y += vel
if keys [pygame.K_SPACE]:
isJump = True
right = False
left = False
walkCount = 0
else:
if jumpCount >= -10:
neg = 1
if jumpCount < 0:
neg = -1
y -= (jumpCount ** 2) * 0.5 * neg
jumpCount -= 1
else:
isJump = False
jumpCount = 10
redrawnewWindow()
pygame.quit()
先來說說本日學習重點吧!
1. 置入背景
想要把黑背景變成彩色的背景。
2. 置入圖片,將方塊變成實體角色
希望能置入圖片把前幾天的淘氣小方框變成真正的小蘿莉。
基於上載音樂的經驗,我覺得上載背景和角色素材應該不難。
這個應該不用多說了吧!昨天已經大篇幅介紹過了。
詳情請見最下方超連結。
圖片上載的開頭和昨天上載音樂相似,在這裡「上載圖片」的關鍵字,就是 pygame.image.load
。
圖片不像音樂一樣可以一首用到底。
可能會有很多人物和背景等等,因此會需要一次上載多張照片。
這個就比較麻煩,要一張一張鍵入素材檔名。
這也是我說的,要先將素材的檔名整理好,建議同類型的,用統一的檔名,這樣上載檔案的時候,比較好寫程式。
以下是我程式碼:
walkRight = [pygame.image.load('Angel-1-3.png'), pygame.image.load('Angel-1-1.png')]
walkLeft = [pygame.image.load('Angel-1-7.png'), pygame.image.load('Angel-1-6.png')]
bg = pygame.image.load('pipo-battlebg007b.png')
值得注意的是,如果一個指令有一張以上的圖片要執行,就要用頓號隔開像是 walkRight = [pygame.image.load('Angel-1-3.png'), pygame.image.load('Angel-1-1.png')]
裡面 pygame.image.load('Angel-1-3.png')
和 pygame.image.load('Angel-1-1.png')]
中間就有頓號。
我會把它放在最一開頭「建立遊戲框」之後。
現在來讓圖片顯示吧!!!
在上程式碼之前一樣要先認識上圖片素材的關鍵字 Surface
和 blit
。
在最一開始設計遊戲的時候,曾經建立一個 gameNaughtybox = pygame.display.set_mode((600,600))
,這個設定是遊戲框的大小,但是這裡要設定的 Surface
是指可以繪圖的區域大小。
我的理解是 Surface
有點像圖層的概念,它就是一個圖層,這個圖層就是用來畫圖的。
因此,我在 gameNaughtybox = pygame.display.set_mode((600,600))
下方,建立了一個 Surface : pygame.Surface((600,600))
,大小我設定和遊戲框一樣大。
我的理解是素材移動,就是把 A圖層的部分或全部圖像素材 移動到 B圖層。bg.blit(bg,(600,600),gameNaughtybox,(0,0))
但是,當我打完以後就出現了...
「TypeError: an integer is required (got type tuple)」
天阿...
好的,回歸理性,暫且不提這個錯誤。
我在寫還有測試的過程中,還有想到一些問題。
啊...也太多問題了吧...
我只是想要用一個小遊戲當專題,怎麼這麼難啊~~~
雖然懷疑人森,但是明天還是會繼續研究怎麼解決...
颱風天風不平浪不靜
打code打到只想靜靜
靜靜收工)泣
別問我靜靜是誰!
你的bg
是一張圖片,應該要用來自 pygame.display.set_mode
的gameNaughtybox
.... 吧XD
gameNaughtybox.blit(bg,(600,600))
(我猜的XD
謝謝你的提點,很受用!